package cn.com.nes.site.handle;

import cn.com.nes.common.em.platform.MessageMethodEnum;
import cn.com.nes.common.util.HttpUtils;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 发送消息处理器
 */
@Component
@Slf4j
public class SendMessageHandler {

    /**
     * 发送消息给指定app
     * @param appCode           // 接收消息的app编码，到nes-message项目中配置
     * @param templateCode      // 消息模板编码，模板内容和校验规则到nes-message项目中配置
     * @param title             // 自定义消息标题
     * @param body              // 自定义消息内容
     * @param target            // 设备识别方式,默认手机号
     * @param targetValueList   // 设备识别value，默认手机号列表
     * @param extParameters     // 自定义消息体,key就是消息模板中定义的字段
     */
    public void sendMessage(String appCode, String templateCode,
                            String title, String body,
                            String target, List<String> targetValueList,
                            Map<String, String> extParameters) throws Exception {
        // 设备识别方式 - 默认手机号
        target = StrUtil.isBlank(target) ? "PHONE" : target;
        // 写死发送端编码
        String sourceApplicationCode = "nes-agent";

        // 获取URL
        String url = MessageMethodEnum.SEND_MESSAGE.getUrl();

        // 构造参数
        JSONObject paramJson = new JSONObject();
        paramJson.put("sourceApplicationCode", sourceApplicationCode);
        paramJson.put("appCode", appCode);
        paramJson.put("templateCode", templateCode);
        paramJson.put("title", title);
        paramJson.put("body", body);
        paramJson.put("target", target);
        paramJson.put("targetValueList", targetValueList);
        paramJson.put("extParameters", extParameters);

        // 调接口发消息
        String result = HttpUtils.sendPost(url, paramJson.toJSONString(), new HashMap<>());

        log.info("title:{}", title);
        log.info("body:{}", body);
        // 解析返回值
        JSONObject apiResponseJson = JSON.parseObject(result);
        if (ObjectUtil.isNotNull(apiResponseJson) && 0 == apiResponseJson.getInteger("code")) {
            log.info("消息推送成功!");
        } else {
            log.error("消息推送失败!");
        }
    }

    /**
     * 给易修发送安装工单消息
     */
    public void sendWorkOrderMessageToEasyRepair(String title, String body, List<String> targetValueList, Map<String, String> extParameters) throws Exception {
        String appCode = "easy-repair";
        String templateCode = "workOrder";
        title = StrUtil.isBlank(title) ? "您有新的安装任务" : title;
        body = StrUtil.isBlank(body) ? "您有新的安装工单,请及时处理" : body;

        this.sendMessage(appCode, templateCode, title, body, "PHONE", targetValueList, extParameters);
    }

    /**
     * 给易修发送安装工单消息
     */
    public void sendWorkOrderMessageToEasyRepair(List<String> targetValueList, Map<String, String> extParameters) throws Exception {
        this.sendWorkOrderMessageToEasyRepair(null, null, targetValueList, extParameters);
    }
}
